perm filename BAZ2[E,ALS] blob
sn#161176 filedate 1975-06-01 generic text, type T, neo UTF8
;Definitions.
.INSERT DEFS.FAI ;The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←0>
IFNDEF OLDDO <OLDDO←0> ;SET NON-ZERO TO MAKE REDOer, which recategorizes news
IFNDEF USRDO <USRDO←0> ;SET NON-ZERO TO CATEGORIZE USER'S TEXT, NOT NEWS
IFE USRDO < IFE OLDDO < REGDO←←1 ; >> REGDO←←0
IFN USRDO < IFN OLDDO < .FATAL ;ILLEGAL SWITCH COMBINATION >>
;Definitions.
.INSERT DEFS.FAI ;The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←0>
IFNDEF OLDDO <OLDDO←0> ;SET NON-ZERO TO MAKE REDOer, which recategorizes news
IFNDEF USRDO <USRDO←0> ;SET NON-ZERO TO CATEGORIZE USER'S TEXT, NOT NEWS
IFE USRDO < IFE OLDDO < REGDO←←1 ; >> REGDO←←0
IFN USRDO < IFN OLDDO < .FATAL ;ILLEGAL SWITCH COMBINATION >>
;Definitions.
.INSERT DEFS.FAI ;The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←0>
IFNDEF OLDDO <OLDDO←0> ;SET NON-ZERO TO MAKE REDOer, which recategorizes news
IFNDEF USRDO <USRDO←0> ;SET NON-ZERO TO CATEGORIZE USER'S TEXT, NOT NEWS
IFE USRDO < IFE OLDDO < REGDO←←1 ; >> REGDO←←0
IFN USRDO < IFN OLDDO < .FATAL ;ILLEGAL SWITCH COMBINATION >>
IFN USRDO < TITLE INDEX -- program to categorize user's text >
IFN OLDDO < TITLE REDO -- program to recategorize old news >
IFN REGDO < TITLE DOER -- categorizer of AP stories >
NOVIZ←←1 ;NON-ZERO MEANS STRIP VISUAL PAPER TAPE NBR FROM FRONT OF AP STORIES
NOLIT↔XALL
F←0 ;CODE OF WIRE WE ARE WORKING ON
A←1
B←2
C←3 ;current character
D←4
E←5 ;counter and temporary AC
L←6 ;length of output text line. Also, number of different keywords.
M←7
N←10
Q←11 ;byte pointer into output story buffer
R←12 ;temporary byte pointer
W←13 ;W:Z are used as LOOKUP and ENTER block
X←14
Y←15
Z←16
P←17 ;pdl pointer
;I/O channels
TO ←←0 ;text output to .TXT file
TI ←←1 ;text input from .TFL file
UFD←←2 ;input from UFD
DAT←←3 ;input from, and output to, .DAT file
DT ←←4 ;deletion of old .DAT files
TX ←←5 ;deletion of old .TXT files
D0 ←←6 ;input/output of DATE00.DAT file
CMN←←7 ;input of common word file COMMON.DAT
ANO←←10 ;output of new NOTIF.ALL file
ANI←←11 ;input of old NOTIF.ALL file and .ADD files
NAP←←12 ;input/output of .NAP file, input of .DEL files
NOP←←13 ;output of .NAP and other notification files
; storage allocations
IFN USRDO <
FILEXT: 0 ;EXTENSION OF USER SPECIFIED FILE
USRPPN: 0 ;PPN OF USER SPECIFIED FILE
>
IFE USRDO <
;XWIRES DEFINES NWIRES AND WIRES
XWIRES
>;END ¬USRDO
IFN DEBUG <
PATCH: BLOCK 40
LSYM←←3000
SYM: BLOCK LSYM
>;END IFN DEBUG
DSK17: 217
SIXBIT /DSK/
0
IFE USRDO <
DSK417: 617 ;FOR LONG BLOCK LOOKUPS
SIXBIT /DSK/
0
DATE00: BLOCK NWIRES+1 ;FOR HOLDING DATE00.DAT FILE
DATECM: IOWD NWIRES+1,DATE00 ;DUMP MODE CMD FOR READING/WRITING DATE00.DAT FILE
0
>;END ¬USRDO
ANBUF: BLOCK 200 ;buffer for holding last record from .NAP file
NTOBUF←←=12 ;number of records in story buffer--must hold whole story
LBUF←←200*NTOBUF
BLOCK 200 ;buffer for holding first part of record where story starts
BUF: BLOCK LBUF ;story buffer for collecting entire story
BUFEND←.-20 ;address used for checking for story buffer overflow
TOCMD: IOWD LBUF,BUF ;dump mode command for writing out new story in .TXT file
0
DATCMD: IOWD 1,DATA ;dump mode command for reading/writing .DAT goes here
0
MAXIGN←←=30 ;number of chars we are willing to ignore in from of story
TMPBUF: BLOCK 2*MAXIGN/5
IFE USRDO <
LORIGS←←5
ORIGS: BLOCK LORIGS ;list of sequence numbers referenced by current story
NORIGS: -1 ;number of entries in ORIGS, minus 1
>;END ¬USRDO
LTEXT←←=600
TEXT: BLOCK LTEXT ;space for collecting and storing whole keywords together
LSORT←←=400
SORT: BLOCK LSORT ;list of sorted keywords: <link>,,<ptr into TEXT>
IFE USRDO <
TFL: 0 ;negative of number of .TFL filenames in table
LTFLST←←20
BLOCK LTFLST ;sorted list of .TFL filenames
TFLST: ;name of this block must follow the block
>;END ¬USRDO
NUBUFS←←2
UFDBUF: BLOCK 203*NUBUFS;buffer space for reading UFD
UBUF: BLOCK 3 ;buffer header for reading UFD
OBUF: BLOCK 3 ;output buffer header for channel NOP
NTIBUF←←2
TIBUF: BLOCK 203*NTIBUF;buffer space for reading in .TFL files
IBUF: BLOCK 3 ;buffer header for reading .TFL files
COMMON: BLOCK LCOMMN ;BLOCK FOR COMMON WORDS AND THEIR PTRS
CMNCMD: IOWD LCOMMN,COMMON ;DUMP MODE CMD FOR READING IN COMMON WORD FILE
0
CMFILE: SIXBIT /COMMON/
SIXBIT /DAT/
0
IFE USRDO <
NSPPN
>;¬USRDO
IFN USRDO <
'USR NS' ;PPN WHERE USER'S COMMON WORD FILE LIVES
>;USRDO
IFN REGDO <
ANFILE: SIXBIT /NOTIF/
SIXBIT /ALL/
0
NSPPN
>;REGDO
INIDAT: 0
INIDIC,,INIDIC ;FORWARD/BACKWARD PTRS TO ONLY INITIAL DICT ENTRY
LINI,,0 ;FREE WORD PTRS FOR .DAT,.TXT
' NS',,2 ;VERSION NUMBER
BLOCK 4 ;UNUSED
INIDIC←←.-INIDAT
1,,1 ;FORWARD/BACKWARD PTRS FOR ONLY DICT ENTRY
377777,,-1 ;INFINITE KEYWORD
-1,,0 ;MARK INFINITE KEYWORD AS NOT REALLY A USABLE KEYWORD
LINI←←.-INIDAT
LPDL←←30
PDL: BLOCK LPDL ;pushdown list
ERRBK: SIXBIT /DSK/ ;block used to start up error-handling program
ERRPRG ;program name goes here
'DMP',,0
1 ;NORMAL CORE SIZE, RPG STARTUP (SA+1)
NSPPN ;PPN OF ERROR.DMP FILE
0 ;LOG ERROR IN UNDER SAME PPN DOER IS USING
IFN REGDO <
REDOBK: SIXBIT /DSK/ ;block used to start up REDO to recategorize .TXT
SIXBIT /REDO/
'DMP',,0
0
NSPPN ;PPN OF REDO.DMP
>;REGDO
IFE USRDO <
WAKEBK: SIXBIT /<DOER>/ ;WAKEME BLOCK TO TELL SYSTEM NEVER TO START DOER
NSPPN
-1
CHKBK: SIXBIT /DSK/ ;block used to start up CHK program
SIXBIT /CHK/ ;program name goes here
'DMP',,14 ;START UP AS PHANTOM JOB
0,,-1 ;NORMAL CORE SIZE, SPECIAL STARTUP (SA-1)
NSPPN ;PPN OF CHK.DMP FILE
0 ;LOG CHK IN UNDER SAME PPN DOER IS USING
MONTH: FOR MON IN (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)
< ASCII \MON \
>
>;END ¬USRDO
STYLEN: 0 ;length of current story (for notification output)
SEQNBR: 0 ;sequence number of current story
ORIGIN: 0 ;pointer (in left half) to original of follow-up, if any
NEWSEQ: 0 ;sequence number of next story (when already seen)
EOF: 0 ;flag indicating whether there is an input file open
EOFDSP: 0 ;address of routine to dispatch to on EOF from .TFL file
EOSDSP: 0 ;address of routine to dispatch to on End Of Story
DATIN: 0 ;flag telling if .DAT file has been read in
IGNORE: 0 ;number of characters we will ignore looking for story
HNGTIM: 0 ;number of times we have tried to do an ENTER and failed
APMIDNIGHT←←=21*=3600 ;SU-AI time in seconds when AP goes to next day
ABSMINDATE←←7113 ;7-JAN-74 in DAYCNT format
ABSMAXDATE←←16502 ;4-JUL-84 in DAYCNT format (PLANNED OBSOLESCENCE!)
TODAY: 0 ;today's date in DAYCNT format--used as file name
APNAME:
IFN USRDO < SIXBIT /INDEX/ >
IFE DEBUG < SIXBIT /[DOER]/ >
IFN DEBUG < SIXBIT /<DOER>/ >
IFE USRDO <
STYTIM: 0 ;<SYSTEM DATE>,,<TIME> OF CURRENT STORY
FOUND: BLOCK NWIRES ;ONE FLAG PER WIRE: -1 IF FOUND SOME NEWS RECENTLY
REPEAT 0 < ;NY NOW USES MORE OR LESS SAME FORMAT AS AP
LOOKBG: NYLKBG
APLKBG
COLEC0: NYCOL0
APCOL0
>;REPEAT 0
>;¬USRDO
;DOER NEXT NEXT1
IFE DEBUG,<
EXIT 1,
>
IFN DEBUG, <
MOVSYM: HRLZ W,JOBSYM↑ ;GET PTR TO SYMBOL TABLE
CAMN W,[SYM,,0] ;HAVE WE MOVED SYMBOLS ALREADY?
EXIT ;YES
HRRI W,SYM ;ADDRESS OF NEW LOC FOR SYMBOL TABLE
HRRM W,JOBSYM ;MAKE NEW PTR TO SYMBOL TABLE
HLRE X,JOBSYM ;GET LENGTH OF SYMBOL TABLE
MOVN X,X ;AND MAKE IT POSITIVE
CAILE X,LSYM
HALT . ;;;NOT ENOUGH ROOM FOR MOVED SYMBOL TABLE
ADDI X,-1(W) ;CALCULATE ADDRESS OF LAST WORD
BLT W,(X) ;MOVE IT
OUTSTR [ASCIZ/OK/]
EXIT
JRST MOVSYM ;START AT -1 TO MOVE SYMBOL TABLE
>
DOER: RESET
IFN OLDDO <
MOVEM F,REWIRE# ;WIRE NUMBER OF .TXT TO BE REDONE IF DETACHED
MOVEM W,REDATE# ;DATE OF .TXT TO BE REDONE
>;OLDDO
MOVE P,[IOWD LPDL,PDL]
IFN REGDO <
SETZM NTDONE ;HAVEN'T DONE NOTIFICATION YET
>;REGDO
IFE USRDO <
MOVEI A,WAKEBK
WAKEME A, ;NEVER START DOER UP
JFCL ;IGNORE WAKEME FAILURE
MOVEI A,INTRPT ;get address of interrupt level module
MOVEM A,JOBAPR↑ ;store it
IFN OLDDO <
MOVSI A,INTPTI ;REDO changes name but doesn't trap parity errors
>;OLDDO
IFE OLDDO <
MOVSI A,INTPTI!INTPAR ;enable interrupts on parity errors and pty input
>;¬OLDDO
INTENB A, ;enable interrupts
MOVSI A,INTPTI
INTGEN A, ;generate a pty input int to set the job name
IFE OLDDO, <
MOVE A,NBRFLR# ;get code indicating number of other DOERs
JRST .+2(A)
EXIT ;ONE OTHER DOER ALREADY EXISTED
EXIT ;;;TWO OR MORE OTHER DOERS ALREADY EXISTED
>;END ¬OLDDO
>;END ¬USRDO
HRROS JOBDDT↑ ;make sure SAVE gets everybody
OPEN CMN,DSK17 ;READ IN COMMON WORD FILE
UFATAL 100 ;;;
MOVE A,[CMFILE,,W]
BLT A,Z
LOOKUP CMN,W ;COMMON WORD FILE
JRST [ LOOKUP CMN,W
UFATAL 101 ;;;FAILED TWICE TO FIND COMMON WORD FILE
JRST .+1] ;WHEW!
IN CMN,CMNCMD
JRST .+2
UFATAL 103 ;;;DISK INPUT ERROR
RELEAS CMN,
INIT TI,200 ;prepare to read .TFL file in
SIXBIT /DSK/
IBUF
UFATAL 104 ;;;CANT INIT DSK
MOVEI W,TIBUF
MOVEM W,JOBFF↑
INBUF TI,NTIBUF ;set up buffers in compiled in area
IFE USRDO <
ALLWIR: SETOM FOUND ;PRETEND WE SAW SOME FIRST WIRE NEWS
LSTWIR: MOVEI F,NWIRES-1 ;CODE OF LAST WIRE
NXTWIR: MOVE A,F ;WIRE CODE
SETZM FOUND(A) ;NO NEWS FOUND FOR THIS WIRE YET
SETZM TFL ;no .TFL filenames sorted yet
>;¬USRDO
SETZM DATIN ;no .DAT file in core yet
IFN OLDDO <
NEXT: PUSHJ P,OLDTXT ;open .TXT file from specified day as .TFL file
>;OLDDO
IFN REGDO <
NEXT: PUSHJ P,TFLFIL ;open oldest .TFL file
JRST [ PUSHJ P,NETWRK ;no .TFL files, do anything needed with DC at CCA
PUSHJ P,TFLFIL ;look again for .TFL files
JRST DOEXIT ;still none--do any bookkeeping and exit
JRST NEXT1] ;got one--process it
>;REDDO
IFN USRDO <
NEXT: JRST USRINI
>;USRDO
IFE USRDO <
NEXT1: PUSHJ P,SETTIM ;Get time of day for story & make sure have .dat+4K
MOVEI W,NEXT
MOVEM W,EOFDSP ;set up dispatch address for EOF
MOVEI W,.+2
MOVEM W,EOSDSP ;set up dispatch address for END OF STORY
SETZB C,L ;clear current character, no chars on current line
MOVEI W,MAXIGN ;set up counter for maximum number of chars we
MOVEM W,IGNORE ; will examine in searching for story beginning
MOVE Q,[POINT 7,TMPBUF] ;set up byte pointer for saving story read in
; MOVE A,F
JRST APLKBG ;@LOOKBG(A)
REPEAT 0 < ;NYLKBG NYCOLL
NYLKBG: PUSHJ P,GETCH ;look for beginning of a story
NYLKB3: CAIN C,"N" ;stories begin with "NYT 41" followed by CRLF
JRST NYLKB2 ;maybe we got one
IFN OLDDO <
UFATAL 105 ;;;MISSING BEGINNING IN OLD .TXT FILE
>;OLDDO
IFE OLDDO <
CAIE C,LF ;(don't count LFs in limit of chars before beginning)
CAIN C,CR ; " " CRs
JRST NYLKBG
SOSL IGNORE ;have we looked far enough for a beginning
JRST NYLKBG ;no--look some more
SETZ C, ;yes--insert special beginning
IDPB C,Q ;mark end of text seen so far
MOVE Q,[POINT 7,BUF] ;set up byte pointer into story buffer
MOVEI R,=999
MOVEM R,SEQNBR ;give this story a special sequence number
MOVEI R,[ASCIZ /N999/]
PUSHJ P,PUTSTR ;put special sequence number into story
PUSHJ P,MAKTIM ;put time of categorization into story
MOVEI R,[ASCIZ /.../]
PUSHJ P,PUTSTR ;and add special message to beginning of story
MOVEI R,TMPBUF
PUSHJ P,PUTSTR ;copy text seen so far into story buffer
JRST NYCOLL ;and go collect rest of story
>;¬OLDDO
NYLKB2: PUSHJ P,GETCH
IFE OLDDO < ;NO "YT " WHEN REDOING
CAIE C,"Y"
JRST NYLKB3
PUSHJ P,GETCH
CAIE C,"T"
JRST NYLKB3
PUSHJ P,GETCH
CAIN C," "
PUSHJ P,GETCH ;SKIP OVER SPACE
>;END ¬OLDDO
MOVEM Q,BEGST# ;SAVE BYTE POINTER TO FIRST DIGIT
MOVEI E,3 ;look for 3 digits of seq nbr
SETZ D, ;calculate seq nbr in D
NYLKB1: CAIL C,"0"
CAILE C,"9" ;is next char a digit?
JRST NYLK00 ;no
IMULI D,=10
ADDI D,-"0"(C) ;add current digit into seq nbr value so far
PUSHJ P,GETCH
SOJA E,NYLKB1 ;COUNT A DIGIT FOUND
NYLKB4:
IFE OLDDO < ;NO CRLF FOLLOWS SEQ NBR IN .TXT FILE
CAIE C,CR ;DIGITS MUST BE FOLLOWED BY CRLF
JRST NYLKB3 ; BUT THEY ARE NOT
PUSHJ P,GETCH
CAIE C,LF
JRST NYLKB3 ;must not be real beginning
ADD Q,[160000,,0] ;BACK UP Q TO BEFORE THE CR AFTER STORY NUMBER
TLNE Q,400000 ;DID BYTE POINTER POSITION FIELD OVERFLOW?
SUB Q,[430000,,1] ;YES, ADJUST BP TO LAST BYTE IN PREVIOUS WORD
>;¬OLDDO
MOVEM D,SEQNBR ;GOT BEGINNING OF STORY--SAVE SEQUENCE NUMBER
SETZ E,
IDPB E,Q ;mark end of seq nbr, and erase the CR
MOVE R,BEGST#
ADD R,[070000,,0] ;BACK UP BYTE PTR TO BYTE BEFORE FIRST DIGIT
MOVE Q,[POINT 7,BUF] ;set up byte pointer into story buffer
MOVEI C,"N"
IDPB C,Q ;MAKE STORY START LIKE "n001"
MOVEI C,"0"
SKIPLE E,ESAVE# ;NEED ANY LEADING ZEROES
IDPB C,Q ;YES, FILL THEM IN
SOJG E,.-1
PUSHJ P,PUTST1 ;copy ASCIZ string from TMPBUF into story buffer
IFN OLDDO <
JRST RECOLL ;COLLECT WHOLE STORY FROM .TXT FILE
>;OLDDO
NYCOL0: PUSHJ P,MAKTIM ;put time of categorization into story
JRST NYCOLL ;YES, READ IN WHOLE STORY
NYLK00: CAIN E,3 ;FIND ANY DIGITS?
JRST NYLKB3 ;NO
JUMPL E,NYLKB3 ;JUMP IF FOUND TOO MANY DIGITS
MOVEM E,ESAVE# ;REMEMBER HOW MANY EXTRA LEADING ZEROES WE NEED
JRST NYLKB4
NYCOLL: SETZM TMPBUF ;HAVE NOT FOUND BEGINNING OF NEXT STORY
MOVEI E,ENDIT1
MOVEM E,EOFDSP
MOVEI E,ENDIT
MOVEM E,EOSDSP
NYCOL1: PUSHJ P,GETCH
NYCOL2: CAIE C,LF ;LOOK FOR [LF]NYT
JRST NYCOL1
MOVEM Q,QSAVE1# ;SAVE BYTE PTR TO JUST BEFORE "NYT123"
PUSHJ P,GETCH
CAIE C,"N"
JRST NYCOL2
PUSHJ P,GETCH
CAIE C,"Y"
JRST NYCOL2
PUSHJ P,GETCH
CAIE C,"T"
JRST NYCOL2
PUSHJ P,GETCH
MOVEI E,3 ;COLLECT AT MOST 3 DIGITS
SETZ D, ;COLLECT SEQ NBR IN D
CAIN C," " ;IGNORE SPACE IF PRESENT AFTER "NYT"
PUSHJ P,GETCH
MOVEM Q,QSAVE2# ;SAVE BYTE PTR TO FIRST DIGIT
NYCOL3: CAIL C,"0"
CAILE C,"9"
JRST NYCOL4 ;NOT A DIGIT
IMULI D,=10
ADDI D,-"0"(C) ;ADD IN CURRENT DIGIT
SOJGE E,NYCOL3 ;COUNT A DIGIT FOUND
JRST NYCOL2 ;TOO MANY DIGITS FOUND
NYCOL4: CAIE E,3 ;SKIP IF NO DIGITS FOUND
CAIE C,CR ;SKIP IF SEQ NBR FOLLOWED BY CR
JRST NYCOL2
PUSHJ P,GETCH
CAIE C,LF
JRST NYCOL1 ;CR NOT FOLLOWED BY LF
MOVEM D,NEWSEQ
SETZ D,
IDPB D,Q ;PUT NULL AT END OF SEQ NBR TEXT
MOVE R,QSAVE2
ADD R,[070000,,0] ;BACK UP BYTE PTR ONE BYTE
MOVE Q,[POINT 7,TMPBUF]
MOVEI C,"N" ;MARK THIS STORY AS NYT
IDPB C,Q
MOVEI C,"0" ;FILL IN MISSING LEADING ZEROES
JUMPE E,.+3 ;JUMP IF NEED NO LEADING ZEROES
IDPB C,Q ;LEADING ZERO
SOJG E,.-1
PUSHJ P,PUTST1 ;MOVE SEQ NBR DIGITS TO TMPBUF
MOVE Q,QSAVE1
JRST ENDIT2 ;MARK CURRENT STORY WITH MISSING ENDING
>;REPEAT 0
;APCOLL RECOLL
;THIS CODE NOW SERVICES BOTH THE AP AND THE NYT LINES
APCOLL: MOVEI E,ENDIT
MOVEM E,EOSDSP ;set up dispatch address for end of story found
MOVEI E,ENDIT1
MOVEM E,EOFDSP ;set up dispatch address for EOF
SETZM TMPBUF ;no new beginning seen yet.
APCOL3: PUSHJ P,GETCH
APCOL1: CAIE C,"a" ;is this possibly beginning of a story "a109<lf>"?
JRST APCOL3 ;no
APCOL4: MOVEI E,3 ;CHECK FOR BEGINNING STORY SEQ NBR AND LF
SETZ D,
APCOL2: PUSHJ P,GETCH
CAIL C,"0"
CAILE C,"9"
JRST APCOL1
IMULI D,=10
ADDI D,-"0"(C)
SOJG E,APCOL2
PUSHJ P,GETCH
CAIE C,LF
JRST APCOL1
MOVEM D,NEWSEQ
ADD Q,[067777,,-1] ;back up byte pointer over new story beginning seen
PUSH P,Q
MOVEI E,4
MOVE R,[POINT 7,TMPBUF]
ILDB C,Q
IDPB C,R ;save new story beginning in TMPBUF
SOJG E,.-2
POP P,Q
JRST ENDIT1
RECOLL: OUTFIV BUF ;TYPE OUT SEQ NBR (4 CHARS FIRST TIME, THEREAFTER 5)
MOVEI E,ENDIT1
MOVEM E,EOFDSP
MOVEI E,ENDIT3
MOVEM E,EOSDSP
PUSHJ P,GETCH ;COLLECT CHARS UNTIL EOF OR END-OF-STORY
JRST .-1